﻿//using System.Collections.Generic;
//using UnityEngine;

///// <summary>
///// 进入场景时，不会自动开始游戏
///// 生成一个方块列表，放入最新的，当最后一个玩家取走队尾方块时，删掉队尾方块
///// 创建玩家位置挂点
///// [Server]每个玩家要有自己的 grid、分数、预览区域等
///// 
///// </summary>
//public class Game : MonoBehaviour {
//    #region Static
//    private static Game _instance;
//    public static Game Instance { get => _instance; }
//    #endregion

//    [SerializeField] TMPro.TextMeshPro tmpScore;
//    [SerializeField] GameObject[] previewGos;
//    [SerializeField] int[] scoreLine = new int[] { 100, 300, 600, 1000 };

//    // string[] tetroPath = new string[] {
//    //     "Prefabs/Tetromino_J",
//    //     "Prefabs/Tetromino_L",
//    //     "Prefabs/Tetromino_Long",
//    //     "Prefabs/Tetromino_S",
//    //     "Prefabs/Tetromino_Z",
//    //     "Prefabs/Tetromino_Squre",
//    //     "Prefabs/Tetromino_T",
//    // };

//    const int MAX_WIDTH = 10;
//    const int MAX_HEIGHT = 20;
//    const int MAX_HEIGHT_EX = MAX_HEIGHT + 2;

//    GameObject[] loadedPrefabs;
//    List<GameObject> inGameTetros;
//    Vector3 startPos = new Vector3(MAX_WIDTH >> 1, MAX_HEIGHT);
//    Transform[,] grid = new Transform[MAX_HEIGHT_EX, MAX_WIDTH];
//    Vector3 v3Up = new Vector3(0, 1, 0);
//    Dictionary<Transform, int> tetroRefCount = new Dictionary<Transform, int>();
//    int nextTetroIdx;
//    int curScore = 0;

//    bool[] destroyMarkArray = new bool[MAX_HEIGHT_EX];

//    private void Awake() {
//        _instance = this;
//        // loadedPrefabs = new GameObject[tetroPath.Length];
//        // for (int i = 0, iCount = tetroPath.Length; i < iCount; i++) { 
//        //     loadedPrefabs[i] = Resources.Load<GameObject>(tetroPath[i]);
//        // }
//        loadedPrefabs = new GameObject[previewGos.Length];
//        for (int i = 0, iCount = previewGos.Length; i < iCount; i++) { 
//            loadedPrefabs[i] = Resources.Load<GameObject>($"Prefabs/{previewGos[i].name}");
//            previewGos[i].SetActive(false);

//        }

//        inGameTetros = new List<GameObject>();
//    }

//    private void Start() {
//        nextTetroIdx = RandomIdx();
//        curScore = 0;
//        tmpScore.SetText("0");
//        NextTetromino();
//    }
//    private void OnDestroy() {
//        tetroRefCount.Clear();
//    }

//    int RandomIdx() {
//        return Random.Range(0, previewGos.Length);
//    }

//    void GenerateTetromino(int idx_) {
//        var go = Instantiate<GameObject>(loadedPrefabs[idx_]);
//        go.transform.position = startPos;
//        inGameTetros.Add(go);
//    }

//    public bool CheckMovingValid(Tetromino tetromino_, bool isFinalPos_ = false) {
//        bool result = true;

//        foreach (Transform mino in tetromino_.transform) {
//            var x = Mathf.RoundToInt(mino.position.x);
//            var y = Mathf.RoundToInt(mino.position.y);
//            if (x < 0 || x >= MAX_WIDTH
//                || y < 0 || (y >= MAX_HEIGHT && isFinalPos_ ||  y < MAX_HEIGHT && grid[y, x])){
//                result = false;
//                break;
//            }
//        }

//        return result;
//    }
//    public void UpdateGrid(Tetromino tetromino_) {
//        var trans = tetromino_.transform;
//        foreach (Transform mino in trans) {
//            var x = Mathf.RoundToInt(mino.position.x);
//            var y = Mathf.RoundToInt(mino.position.y);
//            grid[y, x] = mino;
//        }
//        tetroRefCount.Add(trans, trans.childCount);
//    }

//    public void NextTetromino() {
//        previewGos[nextTetroIdx].SetActive(false);
//        GenerateTetromino(nextTetroIdx);
//        nextTetroIdx = RandomIdx();
//        previewGos[nextTetroIdx].SetActive(true);
//    }

//    public void CheckAndDestroyMinos(int timeScore_) { 
//        // Check
//        int markCount = 0;
//        for (int y = 0, yCount = MAX_HEIGHT; y < yCount; y++) {
//            destroyMarkArray[y] = true;
//            for (int x = 0, xCount = MAX_WIDTH; x < xCount; x++) {
//                if (null == grid[y, x]) {
//                    destroyMarkArray[y] = false;
//                    x = xCount;
//                }
//            }
//            if (destroyMarkArray[y]) { 
//                markCount++;
//            }
//        }
//        // Destroy
//        if (markCount > 0) {
//            int moveCount = 0;
//            for (int y = 0, yCount = MAX_HEIGHT_EX; y < yCount; y++) {
//                if (destroyMarkArray[y]) {
//                    // 消除行 及 数据
//                    moveCount++;
//                    for (int x = 0, xCount = MAX_WIDTH; x < xCount; x++) {
//                        var tetromino = grid[y, x].parent;
//                        Destroy(grid[y, x].gameObject);
//                        tetroRefCount[tetromino]--;
//                        if (0 == tetroRefCount[tetromino]) {
//                            Destroy(tetromino.gameObject);
//                            tetroRefCount.Remove(tetromino);
//                        }
//                        grid[y, x] = null;
//                    }
//                } else if (moveCount > 0){ 
//                    // 下移未被删除的元素的位置及数据
//                    for (int x = 0, xCount = MAX_WIDTH; x < xCount; x++) {
//                        if (grid[y, x]) { 
//                            grid[y, x].position -= v3Up * moveCount;
//                            grid[y - moveCount, x] = grid[y, x];
//                            grid[y, x] = null;
//                        }
//                    }
//                }
//            }
//            // 记录消行分数
//            curScore += scoreLine[markCount - 1];
//        }
//        // 记录时间奖励
//        curScore += timeScore_;
//        tmpScore.SetText(curScore.ToString());
//    }

//    public bool CheckIsGameOver() {
//        bool result = false;
//        for (int x = 0, xCount = MAX_WIDTH; x < xCount; x++) {
//            if (grid[MAX_HEIGHT, x]) {
//                result = true;
//                x = xCount;
//            }
//        }
//        return result;
//    }
//    public void GameOver() { 
//        // TODO: GameOver
//    }
//}
